#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<sched.h>
#include<cstdlib>
#include<thread>
int IntArray[100];

template<typename _t>
void quick_sort(_t*array,size_t const sz){
    if(sz<=1)return;
    _t pivot=array[sz-1];
    size_t start=0,end=sz-2;
    while(end>start){
        while(end>start && array[start]<=pivot)++start;
        while(end>start && array[end]>pivot)--end;
        std::swap(array[start],array[end]);
    }
    if(array[start]>=pivot){ // 5 7 6 5
        std::swap(array[start],array[sz-1]);
    }else ++start;
    // std::cout<<"start : "<<start<<"\tpivot : "<<pivot<<"\tsz : "<<sz<<std::endl;
    // for(size_t i = 0; i < sz; i++){
    //     std::cout<<array[i]<<' ';
    // }std::cout<<std::endl;

    // normal quickSort

    // quick_sort(array,start);
    // quick_sort(array+start,sz-start);

    // multiThread
    std::thread t0(quick_sort,array,start);
    std::thread t1(quick_sort,array+start,sz-start);
    t0.join();
    t1.join();
}
// void quick_sort(size_t const sz){ // global array and multithread version
    
// }
int value=0;
void multiTest(int s){
    pid_t pid=fork();
    if(pid<0){
        exit(-1);
    }else if(pid==0){
        value=42;
    }else{
        wait(0);
        std::cout<<value;
    }
}
int main(){
    for(size_t i = 0; i < 20; i++){
        IntArray[i]=rand()%100;
    }
    quick_sort(IntArray,20);
    for(size_t i = 0; i < 20; i++){
        std::cout<<IntArray[i]<<' ';
    }
    // multiTest(1);
    return 0;
}